﻿/*  Eleven Business Suite : Un ERP básico para pequeños empresarios.
 *  Copyright (C) 2011  Francis Bolaños Arias
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>;.
 */

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using ElevenGlobal;

namespace ElevenData
{

    public class Modificar
    {

        #region Gerencia

        public static bool modificarPais(int IdPais, string Nombre)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("UPDATE [11PAISES] SET Nombre = @Nombre WHERE IdPais = @IdPais");
            SqlParameter param;
            param = comando.Parameters.Add("@IdPais", SqlDbType.Int);
            param.Value = IdPais;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool modificarProvincias(int IdProvincia, int IdPais, string Nombre)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("UPDATE [11PROVINCIAS] SET IdPais = @IdPais, Nombre = @Nombre WHERE IdProvincia = @IdProvincia");
            SqlParameter param;
            param = comando.Parameters.Add("@IdProvincia", SqlDbType.Int);
            param.Value = IdProvincia;
            param = comando.Parameters.Add("@IdPais", SqlDbType.Int);
            param.Value = IdPais;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool modificarCantones(int IdCanton, int IdProvincia, string Nombre)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("UPDATE [11CANTONES] SET IdProvincia = @IdProvincia, Nombre = @Nombre WHERE IdCanton = @IdCanton");
            SqlParameter param;
            param = comando.Parameters.Add("@IdCanton", SqlDbType.Int);
            param.Value = IdCanton;
            param = comando.Parameters.Add("@IdProvincia", SqlDbType.Int);
            param.Value = IdProvincia;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool modificarDistritos(int IdDistrito, int IdCanton, string Nombre)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("UPDATE [11DISTRITOS] SET IdCanton = @IdCanton, Nombre = @Nombre WHERE IdDistrito = @IdDistrito");
            SqlParameter param;
            param = comando.Parameters.Add("@IdDistrito", SqlDbType.Int);
            param.Value = IdDistrito;
            param = comando.Parameters.Add("@IdCanton", SqlDbType.Int);
            param.Value = IdCanton;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool desAnularFactura(int IdFactura)
        {
            //Validar que no este asociada a una entrega.

            //Trasacción. Debe eliminar DetalleOrdenCompra
            //y restar inventario (cant cada producto) si es necesario.
            SqlTransaction tran;
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("UPDATE [11FACTURA] SET Anulada = 0 WHERE IdFactura = @IdFactura");
            SqlParameter param;
            param = comando.Parameters.Add("IdFactura", SqlDbType.Int);
            param.Value = IdFactura;
            comando.Connection = conn;
            conn.Open();
            tran = conn.BeginTransaction();
            try
            {
                //Buscar si ya fue entregada o no.
                DataTable dt = Consultar.ConsultarFacturaXID(IdFactura);
                DataRow dr3 = dt.Rows[0];
                //11VSTORDENCOMPRA.Entregado
                int entregado = int.Parse(dr3["Entregado"].ToString());
                if (entregado == 1)
                {
                    //Modificar Cantidades
                    dt = Consultar.ConsultarDTFactura(IdFactura);
                    foreach (DataRow dr in dt.Rows)
                    {
                        //11VSTDTORDENCOMPRA.IdProducto
                        DataTable dt2 = Consultar.ConsultarProductoXID(int.Parse(dr["IdProducto"].ToString()), conn, tran);
                        //1ra Fila
                        DataRow dr2 = dt2.Rows[0];
                        //11PRODUCTOS.Cantidad - 11VSTDTORDENCOMPRA.Cantidad
                        int Cantidad = int.Parse(dr2["Cantidad"].ToString()) - int.Parse(dr["Cantidad"].ToString());
                        //11VSTDTORDENCOMPRA.IdProducto
                        Modificar.modificarProductoCantidad(int.Parse(dr["IdProducto"].ToString()), Cantidad, conn, tran);
                    }
                }

                //Anular Factura
                comando.Transaction = tran;
                comando.ExecuteNonQuery();

                tran.Commit();
                conn.Close();
                return true;
            }
            catch (Exception)
            {
                tran.Rollback();
                conn.Close();
                return false;
            }
        }

        #endregion

        #region Inventario

        public static bool modificarProveedor(int IdProveedor, string CedJuridica, string Nombre, string NombreJuridico,
            string Direccion, int IdDistrito, string Telefono, string Telefono2, string Fax, string Correo, string SitioWeb)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            string coman = "UPDATE [11PROVEEDORES] SET CedJuridica = @CedJuridica, Nombre = @Nombre" +
                ", NombreJuridico = @NombreJuridico, Direccion = @Direccion,";
            if (IdDistrito != -1)
            {
                coman += " IdDistrito = @IdDistrito, ";
            }
            coman += "Telefono = @Telefono" +
                     ", Telefono2 = @Telefono2, Fax = @Fax, Correo = @Correo, SitioWeb = @SitioWeb " +
                     "WHERE IdProveedor = @IdProveedor";
            SqlCommand comando = new SqlCommand(coman);
            SqlParameter param;
            param = comando.Parameters.Add("@IdProveedor", SqlDbType.Int);
            param.Value = IdProveedor;
            param = comando.Parameters.Add("@CedJuridica", SqlDbType.VarChar, 15);
            param.Value = CedJuridica;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            param = comando.Parameters.Add("@NombreJuridico", SqlDbType.VarChar, 50);
            param.Value = NombreJuridico;
            param = comando.Parameters.Add("@Direccion", SqlDbType.VarChar, 250);
            param.Value = Direccion;
            param = comando.Parameters.Add("@IdDistrito", SqlDbType.Int);
            param.Value = IdDistrito;
            param = comando.Parameters.Add("@Telefono", SqlDbType.VarChar, 20);
            param.Value = Telefono;
            param = comando.Parameters.Add("@Telefono2", SqlDbType.VarChar, 20);
            param.Value = Telefono2;
            param = comando.Parameters.Add("@Fax", SqlDbType.VarChar, 20);
            param.Value = Fax;
            param = comando.Parameters.Add("@Correo", SqlDbType.VarChar, 100);
            param.Value = Correo;
            param = comando.Parameters.Add("@SitioWeb", SqlDbType.VarChar, 100);
            param.Value = SitioWeb;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool modificarCategoria(int IdCategoria, string Nombre, string Descripcion)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("UPDATE [11PRODCAT] SET Nombre = @Nombre, Descripcion = @Descripcion "
                + "WHERE IdCategoria = @IdCategoria");
            SqlParameter param;
            param = comando.Parameters.Add("@IdCategoria", SqlDbType.Int);
            param.Value = IdCategoria;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            param = comando.Parameters.Add("@Descripcion", SqlDbType.VarChar, 250);
            param.Value = Descripcion;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool modificarSubcategoria(int IdSubcategoria, int IdCategoria, string Nombre, string Descripcion)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("UPDATE [11PRODSUBCAT] SET IdCategoria = @IdCategoria, Nombre = @Nombre"
                + ", Descripcion = @Descripcion WHERE IdSubcategoria = @IdSubcategoria");
            SqlParameter param;
            param = comando.Parameters.Add("@IdSubcategoria", SqlDbType.Int);
            param.Value = IdSubcategoria;
            param = comando.Parameters.Add("@IdCategoria", SqlDbType.Int);
            param.Value = IdCategoria;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            param = comando.Parameters.Add("@Descripcion", SqlDbType.VarChar, 250);
            param.Value = Descripcion;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool modificarProductos(int IdProducto, int IdSubcategoria, string Nombre
            , string Descripcion, string IdCodigoBarras, int Gravado)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            string coman = "UPDATE [11PRODUCTOS] SET ";
            if (IdSubcategoria != -1)
            {
                coman += "IdSubcategoria = @IdSubcategoria, ";
            }
            coman += "Nombre = @Nombre, Descripcion = @Descripcion, IdCodigoBarras = @IdCodigoBarras, Gravado = @Gravado" +
                 " WHERE IdProducto = @IdProducto";
            SqlCommand comando = new SqlCommand(coman);
            SqlParameter param;
            param = comando.Parameters.Add("@IdProducto", SqlDbType.Int);
            param.Value = IdProducto;
            if (IdSubcategoria != -1)
            {
                param = comando.Parameters.Add("@IdSubcategoria", SqlDbType.Int);
                param.Value = IdSubcategoria;
            }
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 100);
            param.Value = Nombre;
            param = comando.Parameters.Add("@Descripcion", SqlDbType.VarChar, 250);
            param.Value = Descripcion;
            param = comando.Parameters.Add("@IdCodigoBarras", SqlDbType.VarChar, 50);
            param.Value = IdCodigoBarras;
            param = comando.Parameters.Add("@Gravado", SqlDbType.Int);
            param.Value = Gravado;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool modificarProductoCantidad(int IdProducto, int Cantidad, SqlConnection conn, SqlTransaction tran)
        {
            SqlCommand comando = new SqlCommand("UPDATE [11PRODUCTOS] SET Cantidad = @Cantidad" +
                " WHERE IdProducto = @IdProducto");
            SqlParameter param;
            param = comando.Parameters.Add("@IdProducto", SqlDbType.Int);
            param.Value = IdProducto;
            param = comando.Parameters.Add("@Cantidad", SqlDbType.Int);
            param.Value = Cantidad;
            comando.Connection = conn;
            comando.Transaction = tran;
            comando.ExecuteNonQuery();
            return true;
        }

        #endregion

        #region Punto de Venta

        public static bool modificarCliente(int IdCliente, string Cedula, string Apellido1, string Apellido2, string Nombre,
            string Direccion, int IdDistrito, string Telefono, string Telefono2, string Celular, string Correo)
        {
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            string coman = "UPDATE [11CLIENTES] SET Cedula = @Cedula, Apellido1 = @Apellido1" +
                ", Apellido2 = @Apellido2, Nombre = @Nombre, Direccion = @Direccion";
            if (IdDistrito != -1)
            {
                coman += ", IdDistrito = @IdDistrito";
            }
            coman += ", Telefono = @Telefono, Telefono2 = @Telefono2, Celular = @Celular, Correo = @Correo " +
                 "WHERE IdCliente = @IdCliente";
            SqlCommand comando = new SqlCommand(coman);
            SqlParameter param;
            param = comando.Parameters.Add("@Cedula", SqlDbType.VarChar, 15);
            param.Value = Cedula;
            param = comando.Parameters.Add("@Apellido1", SqlDbType.VarChar, 50);
            param.Value = Apellido1;
            param = comando.Parameters.Add("@Apellido2", SqlDbType.VarChar, 50);
            param.Value = Apellido2;
            param = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50);
            param.Value = Nombre;
            param = comando.Parameters.Add("@Direccion", SqlDbType.VarChar, 250);
            param.Value = Direccion;
            if (IdDistrito != -1)
            {
                param = comando.Parameters.Add("@IdDistrito", SqlDbType.Int);
                param.Value = IdDistrito;
            }
            param = comando.Parameters.Add("@Telefono", SqlDbType.VarChar, 20);
            param.Value = Telefono;
            param = comando.Parameters.Add("@Telefono2", SqlDbType.VarChar, 20);
            param.Value = Telefono2;
            param = comando.Parameters.Add("@Celular", SqlDbType.VarChar, 20);
            param.Value = Celular;
            param = comando.Parameters.Add("@Correo", SqlDbType.VarChar, 100);
            param.Value = Correo;
            param = comando.Parameters.Add("@IdCliente", SqlDbType.Int);
            param.Value = IdCliente;
            comando.Connection = conn;
            conn.Open();
            comando.ExecuteNonQuery();
            conn.Close();
            return true;
        }

        public static bool anularFactura(int IdFactura)
        {
            //Validar que no este asociada a una entrega.

            //Trasacción. Debe eliminar DetalleOrdenCompra
            //y restar inventario (cant cada producto) si es necesario.
            SqlTransaction tran;
            SqlConnection conn = new SqlConnection(Configuracion.connectionString);
            SqlCommand comando = new SqlCommand("UPDATE [11FACTURA] SET Anulada = 1 WHERE IdFactura = @IdFactura");
            SqlParameter param;
            param = comando.Parameters.Add("IdFactura", SqlDbType.Int);
            param.Value = IdFactura;
            comando.Connection = conn;
            conn.Open();
            tran = conn.BeginTransaction();
            try
            {
                //Buscar si ya fue entregada o no.
                DataTable dt = Consultar.ConsultarFacturaXID(IdFactura);
                DataRow dr3 = dt.Rows[0];
                //11VSTORDENCOMPRA.Entregado
                int entregado = int.Parse(dr3["Entregado"].ToString());
                if (entregado == 1)
                {
                    //Modificar Cantidades
                    dt = Consultar.ConsultarDTFactura(IdFactura);
                    foreach (DataRow dr in dt.Rows)
                    {
                        //11VSTDTORDENCOMPRA.IdProducto
                        DataTable dt2 = Consultar.ConsultarProductoXID(int.Parse(dr["IdProducto"].ToString()), conn, tran);
                        //1ra Fila
                        DataRow dr2 = dt2.Rows[0];
                        //11PRODUCTOS.Cantidad + 11VSTDTORDENCOMPRA.Cantidad
                        int Cantidad = int.Parse(dr2["Cantidad"].ToString()) + int.Parse(dr["Cantidad"].ToString());
                        //11VSTDTORDENCOMPRA.IdProducto
                        Modificar.modificarProductoCantidad(int.Parse(dr["IdProducto"].ToString()), Cantidad, conn, tran);
                    }
                }

                //Anular Factura
                comando.Transaction = tran;
                comando.ExecuteNonQuery();

                tran.Commit();
                conn.Close();
                return true;
            }
            catch (Exception)
            {
                tran.Rollback();
                conn.Close();
                return false;
            }
        }

        #endregion

        #region Clientes

        public static bool modificarConsultas(int IdConsulta, int IdCliente, int NivelSatisfaccion, string Contenido, DateTime Fecha)
        {
            try
            {
                SqlConnection conn = new SqlConnection(Configuracion.connectionString);
                SqlCommand comando = new SqlCommand("UPDATE [11CONSULTAS] SET IdCliente = @IdCliente, NivelSatisfaccion = @NivelSatisfaccion, Contenido = @Contenido, Fecha = @Fecha WHERE IdConsulta = @IdConsulta");
                SqlParameter param;
                param = comando.Parameters.Add("@IdConsulta", SqlDbType.Int);
                param.Value = IdConsulta;
                param = comando.Parameters.Add("@IdCliente", SqlDbType.Int);
                param.Value = IdCliente;
                param = comando.Parameters.Add("@NivelSatisfaccion", SqlDbType.Int);
                param.Value = NivelSatisfaccion;
                param = comando.Parameters.Add("@Contenido", SqlDbType.VarChar, 250);
                param.Value = Contenido;
                param = comando.Parameters.Add("@Fecha", SqlDbType.DateTime);
                param.Value = Fecha;
                comando.Connection = conn;
                conn.Open();
                comando.ExecuteNonQuery();
                conn.Close();
                return true;
            }
            catch (Exception ex)
            {
                Cache.ErrorActual = ex.Message;
                return false;
            }
        }

        #endregion

    }
}
